Do kategorie filtrů řadíme příkazy (programy), které jako vstup přijímají text a provedou s ním nějaké operace. Pokud neurčíte kam (>), vypíšou ho standardní výstup (monitor). Některé příkazy už známe. Jde zejména o
catlesssorttailheadwctrsed a awkVšechny (kromě tr) mají jako argument soubor. Pokud ne, stačí jej rourou poslat. Podrobně byly vysvětleny v lekci “Roura”.
Budeme používat ty stejné, uvedené v lekci “Roura”. Pokud je nemáte, stáhněte si je a rozbalte.
grepsearch globally for lines matching the regular expression re, and print them
Příkaz grep v Unixových systémech slouží už od roku 1973 k vyhledávání textových řetězců ve souborech. Umožňuje filtrovat řádky, které obsahují zadaný výraz, a výsledky vypisuje do konzole. Je velmi užitečný pro rychlé nalezení informací v rozsáhlých textových datech a pro zpracování výstupů jiných příkazů v příkazové řádce.
Vybírá a na stdout vypisuje řádky, které odpovídají zadanému vzoru. Standardní syntaxe příkazu je:
grep vzor [soubor]
Bez souboru čte stdin (jako většina ostatních příkazů). Zkuste příkaz:
$ grep pa
a postupně vkládejte slova: „papousek“, „lipan obecny“, „slon indicky“, „salova kopana“, „zelena paprika“… Na stdout pošle grep pouze řádky obsahující vzor „pa“, ostatní odfiltruje (nevypíše na stdout). Vkládání ukončíte Ctrl+D. Vyzkoušejte i pro jiný řetězec a vstup.
Grep má velmi mnoho přepínačů (viz man grep). Užitečné jsou zejména tyto:
--color … obarví červeně nalezené řetězce (na našem TuXovi je tato volba aktivní)-i … ignoruje velikost písmen hledaného textu-n … zobrazí číslo řádku, na kterém se daný výraz nachází-v … vypíše všechny řádky, které neobsahují zadaný řetězec-r … hledá rekurzivně ve všech souborech zadané cestyPříklady:
Vypíše všechny řádky, které obsahují znak 0:
$ grep 0 cisla
Vypíše všechny řádky, které obsahují řetězec rabbit.
$ grep rabbit alice.txt
$ grep -i Rabbit alice.txt
$ grep -n rabbit alice.txt
Projde všechny soubory adresáře /etc včetně podadresářů a vypíše všechny řádky obsahující řetězec linux:
$ grep -nr --color linux /etc
grepRegulární výraz (regular expression, zkráceně REGEX či REGEXP) je speciální řetězec znaků, který představuje určitý vzor (masku) pro textové řetězce – https://www.regularnivyrazy.info/regularni-vyrazy-zaklady.html
Základní regulární výrazy:
^ … je na začátku řádku, např. ^abc (stříška je na začátku řetězce)$ … je na konci řádku, např. abc$ (dolar je na konci řetězce). … jakýkoliv jeden znak (písmeno nebo číslice)\x … nealfanumerický znak kromě tečky (escapování) např. \<mezera>, \#, \-, \; atp.[] … libovolný jeden znak [.], [b]Příklady:
$ grep -nr security /etc
$ grep -nr \.conf$ /etc 2> /dev/null
$ grep -nr [.]conf$ /etc 2> /dev/null
Pomocí roury můžeme grepu posílat libovolný výstup:
$ ls /home | grep 16M
Pomocí více grepů se filtruje kaskádovitě. Nejprve se vyfiltrují řádky podle vzoru v prvním grepu, a ty se rourou odešlou na vstup druhého grepu, který z nich vyfiltruje řádky podle jeho vzoru:
$ grep Alice alice.txt | grep dancing
$ ls /home | grep 16M | grep -i ka
grep a hledání v názvech souborůgrep jde s výhodou využít i při hledání jen určitých názvů souborů. Přepínač -R u ls vypisuje i obsah podadresářů (recursive).
ls /etc | grep host
ls -R /etc | grep host
ls /etc | grep conf$
ls /etc | grep [.]conf$
grep versus findVyhledá a zobrazí všechny soubory končící na .conf:
$ ls -R /etc 2> /dev/null | grep [.]conf$
Vyhledá a zobrazí (včetně cesty) všechny soubory končící na .conf:
$ find /etc -name \*.conf 2> /dev/null
* … libovolný řetězec znaků. \ před hvězdičkou říká, že to je regulární výraz ne znak hvězdička.
Sestavte příkaz, který vypíše všechny uživatelské účty nepatřící studentům. Ty jsou v adresáři /home. Počet řešení vedoucích k výsledku je více.
V konfiguračním souboru /etc/php/8.2/apache2/php.ini se nachází veškerá nastavení překladače PHP (cesta k souboru se může mírně lišit - místo 8.2 může být 8.3 nebo vyšší). Pro potřeby úkolu není podstatné, co který řádek nastavuje. Důležité je, že má skoro 2000 řádků – ruční procházení je nemyslitelné. Většina jeho obsahu jsou komentáře. Ty se poznají tak, že řádek začíná znakem ; (středník). Z toho plyne, že aktivní řádek středníkem nezačíná. “Vygrepujte” všechny řádky, které nezačínají středníkem a naopak obsahují znak =. Součástí výstupu budou i čísla řádků.
Předtím doporučuji si soubor php.ini projít ručně stránkovacím příkazem less. Jen pro pro představu, jak jeho obsah vypadá.